 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.runtime;

 import org.eclipse.core.internal.runtime.IRuntimeConstants;
 import org.eclipse.core.internal.runtime.LocalizationUtils;

 /**
  * A concrete status implementation, suitable either for
  * instantiating or subclassing.
  * <p>
  * This class can be used without OSGi running.
  * </p>
  */
 public class Status implements IStatus {

     /**
      * A standard OK status with an "ok" message.
      *
      * @since 3.0
      */
     public static final IStatus OK_STATUS = new Status(OK, IRuntimeConstants.PI_RUNTIME, OK, LocalizationUtils.safeLocalize("ok"), null); //$NON-NLS-1$
 /**
      * A standard CANCEL status with no message.
      *
      * @since 3.0
      */
     public static final IStatus CANCEL_STATUS = new Status(CANCEL, IRuntimeConstants.PI_RUNTIME, 1, "", null); //$NON-NLS-1$
 /**
      * The severity. One of
      * <ul>
      * <li><code>CANCEL</code></li>
      * <li><code>ERROR</code></li>
      * <li><code>WARNING</code></li>
      * <li><code>INFO</code></li>
      * <li>or <code>OK</code> (0)</li>
      * </ul>
      */
     private int severity = OK;

     /** Unique identifier of plug-in.
      */
     private String pluginId;

     /** Plug-in-specific status code.
      */
     private int code;

     /** Message, localized to the current locale.
      */
     private String message;

     /** Wrapped exception, or <code>null</code> if none.
      */
     private Throwable exception = null;

     /** Constant to avoid generating garbage.
      */
     private static final IStatus[] theEmptyStatusArray = new IStatus[0];

     /**
      * Creates a new status object. The created status has no children.
      *
      * @param severity the severity; one of <code>OK</code>, <code>ERROR</code>,
      * <code>INFO</code>, <code>WARNING</code>, or <code>CANCEL</code>
      * @param pluginId the unique identifier of the relevant plug-in
      * @param code the plug-in-specific status code, or <code>OK</code>
      * @param message a human-readable message, localized to the
      * current locale
      * @param exception a low-level exception, or <code>null</code> if not
      * applicable
      */
     public Status(int severity, String pluginId, int code, String message, Throwable exception) {
         setSeverity(severity);
         setPlugin(pluginId);
         setCode(code);
         setMessage(message);
         setException(exception);
     }

     /**
      * Simplified constructor of a new status object; assumes that code is <code>OK</code>.
      * The created status has no children.
      *
      * @param severity the severity; one of <code>OK</code>, <code>ERROR</code>,
      * <code>INFO</code>, <code>WARNING</code>, or <code>CANCEL</code>
      * @param pluginId the unique identifier of the relevant plug-in
      * @param message a human-readable message, localized to the
      * current locale
      * @param exception a low-level exception, or <code>null</code> if not
      * applicable
      *
      * @since org.eclipse.equinox.common 3.3
      */
     public Status(int severity, String pluginId, String message, Throwable exception) {
         setSeverity(severity);
         setPlugin(pluginId);
         setMessage(message);
         setException(exception);
         setCode(OK);
     }

     /**
      * Simplified constructor of a new status object; assumes that code is <code>OK</code> and
      * exception is <code>null</code>. The created status has no children.
      *
      * @param severity the severity; one of <code>OK</code>, <code>ERROR</code>,
      * <code>INFO</code>, <code>WARNING</code>, or <code>CANCEL</code>
      * @param pluginId the unique identifier of the relevant plug-in
      * @param message a human-readable message, localized to the
      * current locale
      *
      * @since org.eclipse.equinox.common 3.3
      */
     public Status(int severity, String pluginId, String message) {
         setSeverity(severity);
         setPlugin(pluginId);
         setMessage(message);
         setCode(OK);
         setException(null);
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public IStatus[] getChildren() {
         return theEmptyStatusArray;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public int getCode() {
         return code;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public Throwable getException() {
         return exception;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public String getMessage() {
         return message;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public String getPlugin() {
         return pluginId;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public int getSeverity() {
         return severity;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public boolean isMultiStatus() {
         return false;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public boolean isOK() {
         return severity == OK;
     }

     /* (Intentionally not javadoc'd)
      * Implements the corresponding method on <code>IStatus</code>.
      */
     public boolean matches(int severityMask) {
         return (severity & severityMask) != 0;
     }

     /**
      * Sets the status code.
      *
      * @param code the plug-in-specific status code, or <code>OK</code>
      */
     protected void setCode(int code) {
         this.code = code;
     }

     /**
      * Sets the exception.
      *
      * @param exception a low-level exception, or <code>null</code> if not
      * applicable
      */
     protected void setException(Throwable exception) {
         this.exception = exception;
     }

     /**
      * Sets the message. If null is passed, message is set to an empty
      * string.
      *
      * @param message a human-readable message, localized to the
      * current locale
      */
     protected void setMessage(String message) {
         if (message == null)
             this.message = ""; //$NON-NLS-1$
 else
             this.message = message;
     }

     /**
      * Sets the plug-in id.
      *
      * @param pluginId the unique identifier of the relevant plug-in
      */
     protected void setPlugin(String pluginId) {
         Assert.isLegal(pluginId != null && pluginId.length() > 0);
         this.pluginId = pluginId;
     }

     /**
      * Sets the severity.
      *
      * @param severity the severity; one of <code>OK</code>, <code>ERROR</code>,
      * <code>INFO</code>, <code>WARNING</code>, or <code>CANCEL</code>
      */
     protected void setSeverity(int severity) {
         Assert.isLegal(severity == OK || severity == ERROR || severity == WARNING || severity == INFO || severity == CANCEL);
         this.severity = severity;
     }

     /**
      * Returns a string representation of the status, suitable
      * for debugging purposes only.
      */
     public String toString() {
         StringBuffer buf = new StringBuffer ();
         buf.append("Status "); //$NON-NLS-1$
 if (severity == OK) {
             buf.append("OK"); //$NON-NLS-1$
 } else if (severity == ERROR) {
             buf.append("ERROR"); //$NON-NLS-1$
 } else if (severity == WARNING) {
             buf.append("WARNING"); //$NON-NLS-1$
 } else if (severity == INFO) {
             buf.append("INFO"); //$NON-NLS-1$
 } else if (severity == CANCEL) {
             buf.append("CANCEL"); //$NON-NLS-1$
 } else {
             buf.append("severity="); //$NON-NLS-1$
 buf.append(severity);
         }
         buf.append(": "); //$NON-NLS-1$
 buf.append(pluginId);
         buf.append(" code="); //$NON-NLS-1$
 buf.append(code);
         buf.append(' ');
         buf.append(message);
         buf.append(' ');
         buf.append(exception);
         return buf.toString();
     }
 }

